﻿
ASP实现ActiveRecord数据查询更新

引言：

用过 PHP框架 ThinkPHP 或 CI框架的 同学，都知道 这些框架自动的数据查询 Active Record 用于查询数据 和 更新数据 想到方便，
不单它们，很多PHP框架都支持 Active Record，省去了写过多繁琐的原生态SQL查询语句，项目维护更加方便。

现在我们也用在 Asp 代码上进行模拟. 已经成功的应用于 “基于AspBox框架的AppCore” 的应用上。
想看完整的查询示例，请到 AspBox框架 的官网上进行下载 最新源码， 官网： http://www.19www.com/
Google Code下载地址： http://code.google.com/p/aspbox
Author: Lajox ; Email: lajox@19www.com

应用核心代码是从AppCore里进行分离。


=================================================================

【一】： 查询数据

a. 获取结果：

查看输出SQL语句： Dao.getSQL() 用法
别名 Dao.lastSQL()
e.g.
Response.Write Dao.T("media").Top(10).lastSQL


Dao.Query() 用法
dim rs
'dim tb_prefix : tb_prefix = Dao.tbPrefix '数据表前缀
Set rs = Dao.Query("select top 10 id,name from @media").Result()
'等同于： Set rs = Dao.Query("select top 10 id,name from "& tb_prefix &"media").Result()


Dao.List() 用法
dim list
list = dao.t("media").select("id, name").top(10).List()
'ab.trace list '返回一个二维数组
dim i, id, name
For i = 0 To Ubound(list,2)
	id = list(0, i)
	name = list(1, i)
	Response.Write id & " : " & name & "<br>"
Next


Dao.Result() 用法
别名 Dao.GetRs() 或 Dao.Fetch()
dim Rs
Set Rs = Dao.T("media").select("id, name").top(10).Result()
ab.trace Rs
Do While not Rs.eof
	Response.Write Rs("id") & " : " & Rs("name") & "<br>"
	Rs.MoveNext
Loop


Dao.Row(n) 用法 (n表示取得第n+1行数据) Dao.Row(0) 表示取第一行数据
dim Rs
Set Rs = Dao.Query("select top 10 id,name from @media").Row(4) '获取第5行数据
If Not Rs.Eof Then
	Response.Write Rs("id") & " : " & Rs("name")
End If

b. 查询条件：

Dao.T() 用法 和 Dao.From() 用法 等同
Dao.Select() 用法 和 Dao.Field() 用法 等同

Dao.Where() 用法 与 Dao.Find() 用法：

注： Where用法 和 Find用法 基本差不多，都是条件筛选数据。
Find用法 更灵活， 可以用 Dao.Find("1,3,5") 来查询 自动编号(id) 为 1, 3, 5的数据
Dao.Find("1,3,5") 又可以用以下写法：
Dao.Find( Array(1,3,5) )
Dao.Find( "id in (1,3,5)" )
Dao.Where( "id in (1,3,5)" )
Dao.Where( "id=1 or id=3 or id=5" )

Dao.Limit() 用法：
'模拟 mysql的 limit(offset,rows) 用法
'用法：
'limit(0,0) 取全部数据（第1条(0+1=1)数据开始到结束的数据）
'limit(0,1) 取从（第1条(0+1=1)数据开始的1条数据，即：第1~1条）（共1条）
'limit(3,0) 取从（第4条(3+1=4)数据开始到结束的数据，即：第4~最后一条）
'limit(2,5) 表示 第3条(2+1=3)数据开始的5条数据，即：第3~第7条）（共5条）
'limit(1,2) 表示 第2条(1+1=2)数据开始的2条数据，即：第2~第3条）（共2条）
'limit(4,6) 可以这么算：表示 第4+1=5条 到 第4+6=10条）（共6条）
'@注意：Limit用法只能用于查询，不能用于Rs数据更新！

Dim rs
Set rs = Dao.T("test").Where("pid=1").Limit(0,5).Fetch()


附,查询示例：

'Dao.T("test").field("id,name").where("id > 0").order("createtime desc,id desc")
'Dao.T("test").select("id, name").top(10)
'Dao.T("test").select("id, name").order("Rnd(ID)")

Dao.t("user").where("id<>{rq:id} and email='{rq:email}'").find("id>5").result()

'limit基本完成
'Set rs = Dao.T("media").field("id, name").limit(1,5).Fetch()


完整的查询示例：

dim sql
sql = dao.select("id,name").from("media").where("id>10").join("table2").on("table2.cid = user.cid").order("id desc, cid asc").group("id").having("id>5").union("select * from tablexx").getSQL

===============

【二】： 修改数据

添加数据： Dao.Add()
修改数据： Dao.Update() 或 Dao.Set()
删除数据： Dao.Del() 或 Dao.Delete()
智能保存数据（添加或修改）： Dao.Save()
更新某个字段值 Dao.setField()

Dao.AffectedRows() 或 Dao.affRows() 返回影响的行数


dim o_ds, arr(5), str

Dao.t("user").where("id=14").del()
Dao.t("user").delete("1,3,5")
'Dao.t("user").where("id=13").set(Array("username:55"))
'Dao.t("user").where("id=13").setField("name","aaa1111")
'Dao.query("update @user set username='ttt' where id<7").exec()
Dao.query("delete * from @user where id>7").exec()
response.write Dao.AffectedRows() '影响的行数

'Dao.t("user").add( Array("username:tttt", "password:5fe84ad35fb5f95b", "email:ttt@gmail.com") )


arr(0) = "id>5"
arr(1) = "time>#1986#"
arr(2) = "or add=555"
'response.write dao.t("media").where(arr).lastSQL()

Set o_ds = Server.CreateObject("Scripting.Dictionary")
o_ds("id") = "15"
o_ds("name") = "sss"
o_ds("ddds!=") = "dsd"
'response.write dao.t("media").where(o_ds).lastSQL()
'response.write dao.t("media").Find(o_ds).lastSQL()


===============





